#pragma once

// 游戏结束原因
enum GameOverReason {
    LOST,           // 失败
    RIVAL_ADMIT,    // 对手认输
    SELF_ADMIT,     // 自己认输
    WON,            // 胜利
};

// 协议
class GomokuProtocol {
    public: enum Type {
        FIND_USERS,     // 寻找其它用户
        GAME_OVER,      // 游戏结束
        INVITE_REQUEST, // 挑战请求
        INVITE_RESULT,  // 挑战结果
        LOGON,          // 登录
        PUT_PIECE,      // 放置棋子
        QUIT_GAME       // 退出游戏
    };

    public: static const int MAX_USER_COUNT = 50;                       // 最大用户数
    public: static const int MAX_USERNAME_LEN = 16;                     // 最大用户名长度
    public: static const char* SERVER_IP;                               // 服务器 IP 地址
    public: static const short SERVER_PORT = 10000;                     // 服务器端口号
    public: static const int USERNAME_BUF_LEN = MAX_USERNAME_LEN + 1;   // 用户名缓存长度
    public: Type mType;                                                 // 类型
    public: char mUsername[USERNAME_BUF_LEN];                           // 用户名

    public: GomokuProtocol(Type, const char*);
    public: virtual ~GomokuProtocol();
};

// 寻找用户请求
class FindUsersRequest: public GomokuProtocol {
    public: FindUsersRequest(const char*);
};

// 寻找用户结果
class FindUsersResult: public GomokuProtocol {
    public: char mUsernameList[MAX_USER_COUNT][USERNAME_BUF_LEN];   // 用户名列表

    public: FindUsersResult();
};

// 游戏结束
class GameOver: public GomokuProtocol {
    public: GameOverReason mReason; // 结束原因

    public: GameOver(GameOverReason, const char*);
};

// 挑战请求
class InviteRequest: public GomokuProtocol {
    public: char mRivalName[USERNAME_BUF_LEN];  // 对手的名字

    public: InviteRequest(const char*, const char*);
};

// 挑战结果
class InviteResult: public GomokuProtocol {
    public: bool mAccept;                       // 接受挑战则为 true，否则为 false
    public: char mRivalName[USERNAME_BUF_LEN];  // 对手的名字

    public: InviteResult(bool, const char*, const char*);
};

// 登录请求
class LogonRequest: public GomokuProtocol {
    public: LogonRequest(const char*);
};

// 登录结果
class LogonResult: public GomokuProtocol {
    public: LogonResult(const char*);
};

// 放置棋子
class PutPiece: public GomokuProtocol {
    public: int mX; // x 坐标（窗口坐标）
    public: int mY; // y 坐标（窗口坐标）

    public: PutPiece(const char*, int, int);
};

// 退出游戏
class QuitGame: public GomokuProtocol {
    public: QuitGame(const char*);
};
